ARD2  1.00 for Rev B. Hardware
Airbag Reference Demonstrator using MPC5604P
MMA68xx.c File Reference

Driver for central accelerometer. More...

#include "derivative.h"
#include "utils.h"
#include "MMA68xx.h"
#include "DSPI.h"
#include "MailScheduler.h"
#include <limits.h>
#include <stdlib.h>

Functions

uint8_t u8fnMMA6800ReadRegister (const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint8_t cu8TransferMode, uint16_t u16Register, uint16_t *pu16DataRead)
 Reads one register from the MMA6800.
uint8_t u8fnMMA6800WriteRegister (const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint8_t cu8TransferMode, uint16_t u16Register, uint8_t u8ValueToWrite, uint16_t *pu16DataRead)
 Writes to one register of the MMA6800.
uint8_t u8fnMMA6800Reset (const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint8_t cu8TransferMode)
 Performs a soft-reset of the device.
uint8_t u8fnMMA6800ReadAccel (const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint8_t cu8TransferMode, const uint8_t cu8Axis, const uint8_t cu8ConfigMemory, uint16_t *pu16AccelResults, const uint8_t cu8Accel)
 Reads acceleration from the X, Y or both axes.
uint8_t u8fnMMA6800ExtractRegisterResponse (const uint16_t *pu16RawResponse, uint8_t *pu8Response, uint8_t u8Size)
 Extracts 8-bit information from raw data.
uint8_t u8fnMMA6800ExtractAccelResponse (const uint16_t *pu16RawResponse, uint16_t *pu16Response, uint8_t u8Size, const uint8_t cu8Accel)
 Extracts 10-bit accel information from raw data.
uint8_t u8fnMMA6800ScheduledBatchOp (const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint16_t *pu16DataToSend, uint16_t *pu16UnfilteredDataReceived, uint8_t u8Size)
 Schedules n transfers to the device.
uint8_t u8fnMMA6800BatchOp (const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint16_t *pu16DataToSend, uint16_t *pu16UnfilteredDataReceived, uint8_t u8Size)
 Sends n transfers to the device, and reads-back as well.

Variables

const uint16_t cau16MMA6800Reset []
const uint16_t cau16MMA6800ReadAllRegisters []
const uint16_t cau16MMA6500ReadAllRegisters []
const uint16_t cau16MMA6800PerformAccelReading []
const uint16_t cau16MMA6500PerformAccelReading []
uint8_t(*const u8pfnMMA6800BatchOp [])(const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint16_t *pu16DataToSend, uint16_t *pu16UnfilteredDataReceived, uint8_t u8Size)
uint8_t gau8MMA6800GlobalResult [MMA6800_GLOBAL_BUFFER_SIZE]

Detailed Description

Driver for central accelerometer.

Drivers for central accelerometer.

Copyright (c) 2011 Freescale Semiconductor Freescale Confidential Proprietary

Author:
Freescale Semiconductor
SASD Automotive
R11515
R54967
Version:
Date:
Warning:
(If needed)

History:


Function Documentation

uint8_t u8fnMMA6800BatchOp ( const uint8_t  cu8DSPIInstance,
const uint8_t  cu8ChipSelect,
const uint16_t *  pu16DataToSend,
uint16_t *  pu16UnfilteredDataReceived,
uint8_t  u8Size 
)

Sends n transfers to the device, and reads-back as well.

Parameters:
cu8DSPIInstance,:DSPI Instance to use.
cu8ChipSelect,:ChipSelect mask to be used.
pu16DataToSend,:Pointer to complete message to send. Parity is calculated within the function. Constant tables in this file should be used accordingly.
pu16UnfilteredDataReceived,:Pointer to where part's response should be stored. This is the complete response, no filters.
u8Size,:Number of words to send/receive.
Returns:
Status. Clear when no error found, otherwise MMA6800_TIMED_OUT if timed out, or DSPI_BUSY_WITH_PREVIOUS_TX if it can't be written to.
uint8_t u8fnMMA6800ExtractAccelResponse ( const uint16_t *  pu16RawResponse,
uint16_t *  pu16Response,
uint8_t  u8Size,
const uint8_t  cu8Accel 
)

Extracts 10-bit accel information from raw data.

Parameters:
pu16RawResponse,:pointer to 16-bit, unfiltered response.
pu16Response,:pointer to where filtered data should be stored.
u8Size,:Size of raw responses to filter.
cu8Accel,:Choice between MESQUITE and SYCAMORE sensor.
Returns:
Status. Clear when no error found, MMA6800_INVALID_PARITY if at least one of the elements had incorrect parity; MMA6800_ERROR_ACCEL if another error has been found.
uint8_t u8fnMMA6800ExtractRegisterResponse ( const uint16_t *  pu16RawResponse,
uint8_t *  pu8Response,
uint8_t  u8Size 
)

Extracts 8-bit information from raw data.

Parameters:
pu16RawResponse,:pointer to 16-bit, unfiltered response.
pu8Response,:pointer to where filtered data should be stored.
u8Size,:Size of raw responses to filter.
Returns:
Status. Clear when no error found, otherwise MMA6800_INVALID_PARITY.
uint8_t u8fnMMA6800ReadAccel ( const uint8_t  cu8DSPIInstance,
const uint8_t  cu8ChipSelect,
const uint8_t  cu8TransferMode,
const uint8_t  cu8Axis,
const uint8_t  cu8ConfigMemory,
uint16_t *  pu16AccelResults,
const uint8_t  cu8Accel 
)

Reads acceleration from the X, Y or both axes.

Parameters:
cu8DSPIInstance,:DSPI Instance to use.
cu8ChipSelect,:ChipSelect mask to be used.
cu8Axis,:1 for X, 2 for Y, or 3 for both. Any other value will result in an X-axis reading.
cu8ConfigMemory,:Index to perform accel reading with a given configuration. According to the spec: [0] = Offset Compensated, Signed data, ARM disabled [1] = Offset Compensated, Signed data, ARM enabled [2] = Offset Compensated, Unsigned data, ARM disabled [3] = Offset Compensated, Unsigned data, ARM enabled [4] = Raw data, Signed data, ARM disabled [5] = Raw data, Signed data, ARM enabled [6] = Raw data, Unsigned data, ARM disabled [7] = Raw data, Unsigned data, ARM enabled Any other value will return an error code.
pu16AccelResults,:Pointer to location where accel reading(s) will be stored.
cu8Accel,:Choice between MESQUITE and SYCAMORE sensor.
Returns:
Status. Clear when no error found, otherwise MMA6800_INVALID_MEMORY_LOCATION if a cu8ConfigMemory value is out of the expected range; MMA6800_ERROR_ACCEL if the accelerometer value passed in cu8Accel is invalid; MMA6800_INVALID_PARITY if at least one of the elements had incorrect parity; MMA6800_TIMED_OUT if timed out, or DSPI_BUSY_WITH_PREVIOUS_TX if it can't be written to; MAILBOX_IS_BEING_WRITTEN if in scheduled mode and there is a mailbox problem.
uint8_t u8fnMMA6800ReadRegister ( const uint8_t  cu8DSPIInstance,
const uint8_t  cu8ChipSelect,
const uint8_t  cu8TransferMode,
uint16_t  u16Register,
uint16_t *  pu16DataRead 
)

Reads one register from the MMA6800.

Parameters:
cu8DSPIInstance,:DSPI Instance to use.
cu8ChipSelect,:ChipSelect mask to be used.
u16Register,:Address of the register to read with LSB in BIT8. For simplicity, use the #defines in this same file.
cu8TransferMode,:either MMA6800_TRANSFER_MODE_IS_SCHEDULED or MMA6800_TRANSFER_MODE_IS_IMMEDIATE - first option will schedule the transfer using the scheduler, second one will execute the command immediately
pu16DataRead,:Pointer to where data read should be stored. two 16-bit words will be stored: First to be disregarded, second word will contain two 8-bit words: First is status (should read $2E or $3E), second one is data). The second 16-bit word can be fed as argument to u8fnMMA6800ExtractRegisterResponse to get a valid answer.
Returns:
Status. Clear when no error found, or DSPI_BUSY_WITH_PREVIOUS_TX if it can't be written to; MAILBOX_IS_BEING_WRITTEN if in scheduled mode and there is a mailbox problem.
uint8_t u8fnMMA6800Reset ( const uint8_t  cu8DSPIInstance,
const uint8_t  cu8ChipSelect,
const uint8_t  cu8TransferMode 
)

Performs a soft-reset of the device.

Parameters:
cu8DSPIInstance,:DSPI Instance to use.
cu8ChipSelect,:ChipSelect mask to be used.
cu8TransferMode,:either MMA6800_TRANSFER_MODE_IS_SCHEDULED or MMA6800_TRANSFER_MODE_IS_IMMEDIATE - first option will schedule the transfer using the scheduler, second one will execute the command immediately
Returns:
This status byte is actually the read value from the DEVCFG register within the device.
uint8_t u8fnMMA6800ScheduledBatchOp ( const uint8_t  cu8DSPIInstance,
const uint8_t  cu8ChipSelect,
const uint16_t *  pu16DataToSend,
uint16_t *  pu16UnfilteredDataReceived,
uint8_t  u8Size 
)

Schedules n transfers to the device.

Parameters:
cu8DSPIInstance,:DSPI Instance to use.
cu8ChipSelect,:ChipSelect mask to be used.
pu16DataToSend,:Pointer to complete message to send. Parity is calculated within the function. Constant tables in this file should be used accordingly.
pu16UnfilteredDataReceived,:Pointer to where part's response should be stored. This is the complete response, no filters.
u8Size,:Number of words to send/receive.
Returns:
Zero if no problems, otherwise MAILBOX_IS_BEING_WRITTEN.
uint8_t u8fnMMA6800WriteRegister ( const uint8_t  cu8DSPIInstance,
const uint8_t  cu8ChipSelect,
const uint8_t  cu8TransferMode,
uint16_t  u16Register,
uint8_t  u8ValueToWrite,
uint16_t *  pu16DataRead 
)

Writes to one register of the MMA6800.

Parameters:
cu8DSPIInstance,:DSPI Instance to use.
cu8ChipSelect,:ChipSelect mask to be used.
u16Register,:Address of the register to write with LSB in BIT8. For simplicity, use the #defines in this same file.
u8ValueToWrite,:8-bit value to be written to the register.
cu8TransferMode,:either MMA6800_TRANSFER_MODE_IS_SCHEDULED or MMA6800_TRANSFER_MODE_IS_IMMEDIATE - first option will schedule the transfer using the scheduler, second one will execute the command immediately
pu16DataRead,:Pointer to where data read should be stored. two 16-bit words will be stored: First to be disregarded, second word will contain two 8-bit words: First is status (should read $2E or $3E), second one is data). The second 16-bit word can be fed as argument to u8fnMMA6800ExtractRegisterResponse to get a valid answer.
Returns:
Status. Clear when no error found, or DSPI_BUSY_WITH_PREVIOUS_TX if it can't be written to; MAILBOX_IS_BEING_WRITTEN if in scheduled mode and there is a mailbox problem.

Variable Documentation

const uint16_t cau16MMA6500ReadAllRegisters[]
Initial value:
{
  (MMA6800_SN0 | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_SN1
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_SN2
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_SN3
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_STDEFL_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_STDEFL_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_FCTCFG_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_FCTCFG_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_PN
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCTL
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCFG
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCFG_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCFG_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMCFGX
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMCFGY
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_XP
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_YP
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_XN
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_YN
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVSTAT
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_COUNT
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_OFF_CORR_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_OFF_CORR_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR) }
const uint16_t cau16MMA6800ReadAllRegisters[]
Initial value:
{
  (MMA6800_SN0 | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_SN1
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_SN2
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_SN3
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_FCTCFG_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_FCTCFG_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_PN
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCTL
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCFG
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCFG_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVCFG_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMCFGX
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMCFGY
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_XP
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_YP
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_XN
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_ARMT_YN
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_DEVSTAT
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_COUNT
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_OFF_CORR_X
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR), (MMA6800_OFF_CORR_Y
      | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR) }
const uint16_t cau16MMA6800Reset[]
Initial value:
{
  
  (MMA6800_DEVCTL | (MMA6800_WRITE_REGISTER << CHAR_BIT) | CLEAR),
  (MMA6800_DEVCTL | (MMA6800_WRITE_REGISTER << CHAR_BIT) | 0xC0u),
  (MMA6800_DEVCTL | (MMA6800_WRITE_REGISTER << CHAR_BIT) | 0x40u),
  
  (MMA6800_DEVCFG | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR),
  (MMA6800_DEVCFG | (MMA6800_READ_REGISTER << CHAR_BIT) | CLEAR) }
uint8_t(* const u8pfnMMA6800BatchOp[])(const uint8_t cu8DSPIInstance, const uint8_t cu8ChipSelect, const uint16_t *pu16DataToSend, uint16_t *pu16UnfilteredDataReceived, uint8_t u8Size)